// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.eva.android.widget;import android.os.Bundle;import android.os.Handler;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import androidx.fragment.app.Fragment;import java.lang.ref.SoftReference;/** * 一个可重用的Fragment类 * @author Freeman */public abstract class AFragment extends Fragment implements        OnClickListener {    public static final int WHICH_MSG = 0X39188;    protected View fragmentRootView;    private ThreadDataCallBack callback;    private AFragmentHandle threadHandle = new AFragmentHandle(this);    /**     * 一个私有回调类，线程中初始化数据完成后的回调     */    private interface ThreadDataCallBack {        void onSuccess();    }    private static class AFragmentHandle extends Handler {        private final SoftReference<AFragment> mOuterInstance;        AFragmentHandle(AFragment outer) {            mOuterInstance = new SoftReference<>(outer);        }        // 当线程中初始化的数据初始化完成后，调用回调方法        @Override        public void handleMessage(android.os.Message msg) {            AFragment fragment = mOuterInstance.get();            if (msg.what == WHICH_MSG && fragment != null) {                fragment.callback.onSuccess();            }        }    }    protected abstract View inflaterView(LayoutInflater inflater,                                         ViewGroup container, Bundle bundle);    /**     * initialization widget, you should look like parentView.findviewbyid(id);     * call method     *     * @param parentView     */    protected void initWidget(View parentView) {    }    /**     * initialization data     */    protected void initData() {    }    /**     * initialization data. And this method run in background thread, so you     * shouldn't change ui<br>     * on initializated, will call threadDataInited();     */    protected void initDataFromThread() {        callback = new ThreadDataCallBack() {            @Override            public void onSuccess() {                threadDataInited();            }        };    }    /**     * 如果调用了initDataFromThread()，则当数据初始化完成后将回调该方法。     */    protected void threadDataInited() {    }    /**     * 当通过changeFragment()显示时会被调用(类似于onResume)     */    public void onChange() {    }    /**     * widget click method     */    protected void widgetClick(View v) {    }    @Override    public void onClick(View v) {        widgetClick(v);    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        fragmentRootView = inflaterView(inflater, container, savedInstanceState);//        AnnotateUtil.initBindView(this, fragmentRootView);        initData();        initWidget(fragmentRootView);        new Thread(new Runnable() {            @Override            public void run() {                initDataFromThread();                threadHandle.sendEmptyMessage(WHICH_MSG);            }        }).start();        return fragmentRootView;    }    protected <T extends View> T bindView(int id) {        return (T) fragmentRootView.findViewById(id);    }    protected <T extends View> T bindView(int id, boolean click) {        T view = (T) fragmentRootView.findViewById(id);        if (click) {            view.setOnClickListener(this);        }        return view;    }}